#ifndef ISI_H
#define ISI_H

#include <QObject>
#include <QtSql>
#include <qfiledialog.h>
#include "globalvar.h"

class Isi;

/**
 * @brief The Isi class         Основной класс для получения информации из файла *.isi
 */
class Isi:public QObject
{
    Q_OBJECT
public:
    explicit Isi(const int numConnection = 1, QObject *parent = nullptr);
    ~Isi();
    /**
     * @brief createTable             создание таблиц header и data для Клиента
     */
    void createTable();
    /**
     * @brief insertHeader            вставка данных в таблицу header
     */
    bool insertHeader(QStringList list);
    /**
     * @brief insertData              вставка данных в таблицу data
     */
    bool insertData(QStringList list);
    /**
     * @brief selectRow               получить следующий номер (rowid) записи в таблице data после последней отображенной точки (сортировка по времени)
     * @param elapsed                 время последней отображенной точки
     * @return
     */
    int selectRow(int elapsed);
    /**
     * @brief selectTime              получить значение времени из базы данных по номеру строки и столбца
     * @param row                     номер строки
     * @param column                  номер столбца
     * @return
     */
    double selectTime(int row,int column);
    /**
     * @brief selectValue            получить значение бита необходимого элемента
     * @param row                    номер строки
     * @param column                 номер столбца
     * @param bit                    необходимый бит
     * @return
     */
    qint64 selectValue(int row, int column, int bit);
    /**
     * @brief selectValue           перегрузка метода selectValue
     * @param row                   номер строки
     * @param index                 номер параметра
     * @return
     */
    qint64 selectValue(int row, int index);
    /**
     * @brief getParams              получить количество параметров
     * @return
     */
    int getParams();
    /**
     * @brief open                   проверка открыта база данных или нет
     * @return
     */
    bool open();
    /**
     * @brief getCountIn             получить количество параметров на вход
     * @return
     */
    int getCountIn();
    /**
     * @brief getCountOut            получить количество параметров на выход
     * @return
     */
    int getCountOut();
    /**
     * @brief setPath               назначить адрес для базы данных
     * @param path
     */
    void setPath(const QString &path = "");
    /**
     * @brief path                  получить путь базе данных
     * @return
     */
    QString path();

    /**
     * @brief getNameParam          получить название параметра по индексу
     * @param index                 индекс параметра
     * @return                      вернет название параметра
     */
    QString getNameParam(int index);

private:
    /**
     * @brief d_path                путь к базе данных
     */
    QString d_path;
    /**
     * @brief d_db                  объект класса QSqlDatabase, необходим для получения данных из базы данных
     */
    QSqlDatabase d_db;

    /**
     * @brief d_nameConnection      имя подключения для базы данных
     */
    QString d_nameConnection;
};






// * @brief The Isi class         Основной класс для получения информации из файла *.isi
// */
//class Isi : public QObject
//{
//    Q_OBJECT
//public:
//    /**
//     * @brief Isi               Конструктор класса Isi, необходим для создания баз данных
//     * @param numConnection     Номер подключения, по умолчанию = 1
//     * @param parent
//     */
//    explicit Isi(const int numConnection = 1, QObject *parent = nullptr);
//    ~Isi();
//    /**
//     * @brief path              Метод получения названия базы данных
//     * @return
//     */
//    QString path();
//    /**
//     * @brief setPath           Метод установления подключения к базе данных, открывает диологовое окно и в переменную m_path устанавливает имя выбранной базы данных
//     * @param path
//     */
//    void setPath(const QString &path = "");
//    /**
//     * @brief header            Ссылка на объект класса Header
//     * @return                  Возвращает объект m_header
//     */
//    Header *header();
//    /**
//     * @brief setHeader         Метод установления в объект m_header значений считанных из таблицы Header методом load
//     * @return
//     */
//    bool setHeader();
//    /**
//     * @brief messageList       Коннтейнер состоящий из объектов класса Message, содержащий в себе значения из таблицы Data
//     * @return
//     */
//    QList<Message *> messageList();
//    /**
//     * @brief loadMessageList   Метод загрузки данных из таблицы Data в messageList
//     */
//    void loadMessageList();
//    /**
//     * @brief load              Метод вывода данных в qDebug()
//     */
//    void load();


//    /**
//     * @brief dataId            Список с данными из столбца Id
//     * @return
//     */
//    QList<int> dataId();
//    /**
//     * @brief loadData          Загрузка данных по id
//     */
//    void loadData();
//    /**
//     * @brief clearList         Очистка cписка m_messageList
//     */
//    void clearList();
//    /**
//     * @brief getRowCount       Получение количества строк
//     * @return
//     */
//    int getRowCount();
//    /**
//     * @brief columnCount       Колчество столбцов
//     * @return
//     */
//    int columnCount();
//    /**
//     * @brief getNameItem       Получение названия столбца
//     * @param section           Номер столбца
//     * @return                  Возвращает название столбца
//     */
//    QString getNameItem(const int section) const;

//    /**
//     * @brief getValueItem      Получение значения элемента
//     * @param row               Номер строки
//     * @param column            Номер столбца
//     * @return                  Возвращает значение по заданным параметрам
//     */
//    QVariant getValueItem(const int row, const int column) const;
//    /**
//     * @brief getValueItemBit   Получение значение бита элемента
//     * @param row               Номер строки
//     * @param column            Номер столбца
//     * @param bit               Номер необходимого бита
//     * @return                  Возвращает значение необходимого бита
//     */
//    int getValueItemBit(const int row, const int column, const int bit = -1) const;

//signals:

//private:
//    /**
//     * @brief m_db              Объект класса QSqlDatabase, необходимый для получения и установления данных из конкретной базы данных
//     */
//    QSqlDatabase m_db;
//    /**
//     * @brief m_path            Строка, в которой хранится название базы данных
//     */
//    QString m_path;
//    /**
//     * @brief m_header          Ссылка на объект класса Header, необходима для установления значения значений из таблицы Header
//     */
//    Header *m_header;
//    /**
//     * @brief m_messageList     Объект класса QList, в котором хранятся объекты структуры Message
//     */
//    QList<Message*> m_messageList;
//    /**
//     * @brief m_nameConnection  Строка с именем подключения, необходима для создания и подключения к конкретной базе данных
//     */
//    QString m_nameConnection;
//    /**
//     * @brief m_dataId          Список с значениями из столбца id
//     */
//    QList<int> m_dataId;
//    /**
//     * @brief m_rowCount        Количество строк
//     */
//    int m_rowCount;

//};
#endif // ISI_H
